package com.bs.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bs.model.Msg;
import com.bs.model.User;
import com.bs.service.IMsgService;
import com.bs.service.IUserService;
import com.bs.vo.PageParamVo;
import com.bs.vo.PageVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 说明：
 *
 * @author 陈晓琪
 * @since 2025年05月23日 星期五 07:47:50
 */
@Service
@Slf4j
public class MsgServiceImpl extends ServiceImpl<BaseMapper<Msg>, Msg> implements IMsgService {

    @Autowired
    private IUserService userService;

    @Override
    public boolean save(Msg entity) {
        entity.setCreateTime(new Date());
        entity.setUpdateTime(new Date());
        return super.save(entity);
    }

    @Override
    public boolean updateById(Msg entity) {
        entity.setUpdateTime(new Date());
        return super.updateById(entity);
    }

    @Override
    public PageVo<Msg> pageMsg(PageParamVo<Msg> pageParam) {
        Msg condition = pageParam.getCondition();
        QueryWrapper<Msg> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("create_time");
        if (condition != null) {
            queryWrapper.setEntity(condition);
        }
        IPage<Msg> page = page(pageParam.toPage(), queryWrapper);
        fillUserName(page.getRecords());
        return new PageVo<>(page);
    }

    private void fillUserName(List<Msg> records) {
        List<String> userIdList = records
                // 学习对流式编程的使用 1
                .stream()
                // 转换: 数组中元素内容
                .map(Msg::getUserId)
                // 过滤: 空的字符串
                .filter(StrUtil::isNotBlank)
                // 去重
                .distinct()
                // 收纳为新的数组
                .collect(Collectors.toList());
        if (userIdList.isEmpty()) {
            // userIdList为空,没有用户,返回
            return;
        }
        List<User> users = userService.listByIds(userIdList);
        Map<String, String> userIdNameMap = users
                // 学习对流式编程的使用 2
                .stream()
                // 转换为Map对象
                .collect(Collectors.toMap(
                        // 返回Map的key
                        User::getId,
                        // 返回Map的value
                        User::getName
                ));
        records
                // 学习对流式编程的使用 3
                .forEach(record ->
                        // 遍历元素: 填充用户名称, 如果没有该用户, 填充为"匿名"用户
                        record.setUserName(userIdNameMap.getOrDefault(record.getUserId(), "匿名"))
                );
    }
}